package com.team9.fitness.service;

import com.team9.fitness.entity.CommunityPost;
import com.team9.fitness.mapper.CommunityPostMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.HashMap;
import java.util.Map;

/**
 * 社区帖子服务类
 * 
 * 提供社区帖子相关的业务逻辑：
 * - 帖子管理：创建、更新、删除帖子
 * - 查询功能：支持按用户、ID查询，支持排序
 * - 统计功能：统计帖子的点赞、喜欢、评论数量
 * - 状态管理：支持用户点赞、喜欢状态查询
 */
@Service
@Transactional
@Slf4j
public class CommunityPostService {

    @Autowired
    private CommunityPostMapper communityPostMapper;

    /**
     * 创建帖子
     */
    public CommunityPost createPost(CommunityPost post) {
        log.info("创建社区帖子: userId={}, title={}", post.getUserId(), post.getTitle());

        // 初始化统计字段
        post.initializeCounts();
        post.setCreatedAtIfNull();
        post.setUpdatedAtIfNull();

        communityPostMapper.insert(post);
        log.info("创建社区帖子成功: id={}", post.getId());

        return post;
    }

    /**
     * 获取所有帖子（按创建时间倒序，包含统计信息）
     */
    public List<CommunityPost> getAllPosts(Long currentUserId) {
        log.info("获取所有社区帖子，当前用户: {}", currentUserId);
        return communityPostMapper.selectAllWithStatsOrderByCreatedAtDesc(currentUserId);
    }

    /**
     * 根据用户ID获取帖子（包含统计信息）
     */
    public List<CommunityPost> getPostsByUserId(Long userId, Long currentUserId) {
        log.info("获取用户帖子: userId={}, currentUserId={}", userId, currentUserId);
        return communityPostMapper.selectByUserIdWithStatsOrderByCreatedAtDesc(userId, currentUserId);
    }

    /**
     * 根据ID获取帖子（包含统计信息）
     */
    public Optional<CommunityPost> getPostById(Long id, Long currentUserId) {
        log.info("根据ID获取帖子: id={}, currentUserId={}", id, currentUserId);
        return communityPostMapper.selectByIdWithStats(id, currentUserId);
    }

    /**
     * 更新帖子
     */
    public CommunityPost updatePost(CommunityPost post) {
        log.info("更新帖子: id={}", post.getId());

        post.setUpdatedAtIfNull();
        communityPostMapper.updateById(post);

        log.info("更新帖子成功: id={}", post.getId());
        return post;
    }

    /**
     * 删除帖子
     */
    public void deletePost(Long id) {
        log.info("删除帖子: id={}", id);
        communityPostMapper.deleteById(id);
        log.info("删除帖子成功: id={}", id);
    }

    /**
     * 创建帖子业务逻辑（供ZRDDS调用）
     */
    public CommunityPost createPostByZRDDS(Long userId, String title, String content) {
        try {
            log.info("创建社区帖子: userId={}, title={}", userId, title);

            CommunityPost post = new CommunityPost();
            post.setUserId(userId);
            post.setTitle(title);
            post.setContent(content);
            post.initializeCounts();
            post.setCreatedAtIfNull();
            post.setUpdatedAtIfNull();

            communityPostMapper.insert(post);
            log.info("创建社区帖子成功: id={}", post.getId());

            return post;
        } catch (Exception e) {
            log.error("创建社区帖子失败: userId={}, title={}", userId, title, e);
            return null;
        }
    }

    /**
     * 点赞帖子业务逻辑（供ZRDDS调用）
     */
    public boolean likePostByZRDDS(Long userId, Long postId) {
        try {
            log.info("点赞帖子: userId={}, postId={}", userId, postId);

            // 这里可以实现点赞逻辑，比如在数据库中记录点赞关系
            // 由于当前数据库结构中没有点赞表，这里只是模拟点赞成功
            log.info("点赞帖子成功: userId={}, postId={}", userId, postId);
            return true;
        } catch (Exception e) {
            log.error("点赞帖子失败: userId={}, postId={}", userId, postId, e);
            return false;
        }
    }

    /**
     * 更新帖子点赞数量
     */
    public void updatePostLikeCount(Long postId, Integer likeCount) {
        try {
            communityPostMapper.updateLikeCount(postId, likeCount);
            log.debug("更新帖子点赞数量: postId={}, likeCount={}", postId, likeCount);
        } catch (Exception e) {
            log.error("更新帖子点赞数量失败: postId={}, likeCount={}", postId, likeCount, e);
        }
    }

    /**
     * 更新帖子喜欢数量
     */
    public void updatePostFavoriteCount(Long postId, Integer favoriteCount) {
        try {
            communityPostMapper.updateFavoriteCount(postId, favoriteCount);
            log.debug("更新帖子喜欢数量: postId={}, favoriteCount={}", postId, favoriteCount);
        } catch (Exception e) {
            log.error("更新帖子喜欢数量失败: postId={}, favoriteCount={}", postId, favoriteCount, e);
        }
    }

    /**
     * 更新帖子评论数量
     */
    public void updatePostCommentCount(Long postId, Integer commentCount) {
        try {
            communityPostMapper.updateCommentCount(postId, commentCount);
            log.debug("更新帖子评论数量: postId={}, commentCount={}", postId, commentCount);
        } catch (Exception e) {
            log.error("更新帖子评论数量失败: postId={}, commentCount={}", postId, commentCount, e);
        }
    }
}
